package com.itheima.controller;

import cn.itheima.health.service.CheckItemService;
import com.itheima.constant.MessageConstant;
import com.itheima.healt.entlty.QueryPageBean;
import com.itheima.healt.entlty.Result;
import com.itheima.pojo.CheckItem;
import javafx.scene.control.Pagination;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

/*
        前端页面 发送 axios.post/get 请求后   后台就会来访问 controller 控制层

       @   固定写法：    RestController     控制 是相应Js 格式  区别于 普通的 @Controller
                       RequestMapping       映射
                       RequestBody   请求体/请求的参数  所在的类/ 参数从哪里拿
 */

@RestController   // @   固定写法：    RestController     控制 是相应Js 格式  区别于 普通的 @Controller
@RequestMapping("/checkitem")
public class CheckItemController {

    //2. 调用业务层：    业务层需要从我们的  生产者 中调用  所以这里需要添加 @Reference 注解(选)apache包
    @Reference
    private CheckItemService checkItemService;  // CheckItemService 的取名： 实体类+Service  ：(生产者)

    //1. 拿到数据：
             /*   @RequestBody注解的 使用方法:
                          因为这里从前端 发送过来的请求 是一个  formData ：表单数据，
                          表单中的数据 对应的就是 Pojo实体类中的 CheckItem 类
                          所以这里使用 @RequestBody注解  映射序列化 CheckItem  */
    //因为web层发送的post请求是 "/checkitem/add.do" 所以这里是add 方法
    @RequestMapping("/add.do")
    @PreAuthorize("hasAuthority('CHECKITEM_ADD')")    //这是 给该方法添加权限 ，此方法 应该根据  有登陆权限的 角色
                                                                //然后在 数据库中 t_permission 表 查询 角色 所对应的 权限 之后才能访问

            /*   这个 return 的 返回值  实际开发中 我们做这些操作，调用一些列方法
                 这个返回值 到底 用来返还什么 给 我们的web层  作为参数判断
                 对应前端来说，我们前端是要接收这信息的 (res)
                 由于后期还有其他请求 数据量较多，为了便于查看 所以我们这里
                 由 公共资源类 中的  MessageConstant 类 作为统一管理
                        由于 我们的业务涉及到 增删改查  返回值类型不同
                             所以这里要创建一个 标准化 结果集 响应对象 ： Result
                                     用于无论是 增删改查  我们的 返回值 都可以是  Result
                                      然后从前端 直接接收 统一的  Result 返回值 结果集 就可以了
                                      因为这结果集对象 适用于 所有模块 所以 放在 health_pojo 中的 pojo包中   */
    // @RequestBody  封装数据的
    public Result add(@RequestBody CheckItem checkItem) {

//3. 生产者 checkItemService 创建一个add 的方法，将得到的数据 checkItem 添加进去
        try {
            checkItemService.add(checkItem);
            // true 表示创建成功
            //创建一个 结果集 响应对象 ( 然后里面创建 MessageConstant类 .String  类型作为提示信息)
            return new Result(true, MessageConstant.ADD_CHECKGROUP_SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.ADD_CHECKITEM_FAIL);
        }

    }

    @RequestMapping("/findPage.do")
    @PreAuthorize("hasRole('ROLE_ADMIN')")   //  给这  方法设置 角色， 只有 授权了 能够登陆的 角色，
                                             //   并且在数据库  t_role 表 中 成功登陆后 对应的角色
                                             //       有 ROLE_ADMIN 这角色的 用户才能访问 该功能
    public Result findPage(@RequestBody QueryPageBean queryPageBean) {
        try {
            //  因为 有lest<T> 和 total 等其他数据 传入，所以这里返还的是一个Map集合
           Map map= checkItemService.findPage(queryPageBean);
            // true 表示创建成功
            //创建一个 结果集 响应对象 ( 然后里面创建 MessageConstant类 .String  类型作为提示信息)
            //  因为 有增加了一个map 集合 所以 需要用到 Result 的第二个构造方法
            return new Result(true, MessageConstant.QUERY_CHECKITEM_SUCCESS,map);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.QUERY_CHECKITEM_FAIL);
        }
    }
    @RequestMapping("/deleteCheckItemById.do")
    public Result deleteCheckItemById(@RequestParam("id")Integer id) {
        try {
            //  因为 有lest<T> 和 total 等其他数据 传入，所以这里返还的是一个Map集合
          checkItemService.deleteCheckItemById(id);
            // true 表示创建成功
            //创建一个 结果集 响应对象 ( 然后里面创建 MessageConstant类 .String  类型作为提示信息)
            //  因为 有增加了一个map 集合 所以 需要用到 Result 的第二个构造方法
            return new Result(true, MessageConstant.DELETE_CHECKITEM_SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.DELETE_MEMBER_FAIL);
        }
    }

    @RequestMapping("/edit.do")
    public Result edit(@RequestBody CheckItem checkItem) {
        try {
            checkItemService.edit(checkItem);
            // true 表示创建成功
            //创建一个 结果集 响应对象 ( 然后里面创建 MessageConstant类 .String  类型作为提示信息)
            return new Result(true, MessageConstant.EDIT_CHECKITEM_SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.EDIT_CHECKITEM_FAIL);
        }
    }

    @RequestMapping("/findAll.do")
    public Result findAll(){
        try {
            //创建一个List集合 用于存储 在创建的 checkItemService 里面添加一个 findAll的方法
            List<CheckItem> list = checkItemService.findAll();
            //将数据封装完成之后 返回这集合
            return  new Result(true, MessageConstant.QUERY_CHECKITEM_SUCCESS,list);
        } catch (Exception e) {
            e.printStackTrace();
            return  new Result(false, MessageConstant.QUERY_CHECKITEM_FAIL);
        }
    }
}
